<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script lang="javascript">
    // 1.原型链继承
    // 改变s1的play属性，会发现s2也跟着发生变化了，这是因为两个实例使用的是同一个原型对象，内存空间是共享的
    // function Parent() {
    //   this.name = 'parent1';
    //   this.play = [1, 2, 3]
    // }
    // function Child() {
    //   this.type = 'child2';
    // }
    // Child.prototype = new Parent();
    // console.log(Child.prototype);
    // console.log(new Child())
    // var s1 = new Child();
    // var s2 = new Child();
    // s1.play.push(4);
    // console.log(s1.play, s2.play); // [1,2,3,4]


    // 2.构造函数继承（借助call调用Parent函数）
    // 父类原型对象中一旦存在父类之前自己定义的方法，那么子类将无法继承这些方法
    // function Parent(){
    //     this.name = 'parent1';
    // }
    // Parent.prototype.getName = function () {
    //     return this.name;
    // }
    // function Child(){
    //     Parent.call(this);
    //     this.type = 'child'
    // }
    // let child = new Child();
    // console.log(child);  // 没问题
    // console.log(child.getName());  // 会报错
    
    // 3.组合继承
    // function Parent3 () {
    //     this.name = 'parent3';
    //     this.play = [1, 2, 3];
    // }
    // Parent3.prototype.getName = function () {
    //     return this.name;
    // }
    // function Child3() {
    //     // 第二次调用 Parent3()
    //     Parent3.call(this);
    //     this.type = 'child3';
    // }
    // // 第一次调用 Parent3()
    // Child3.prototype = new Parent3();
    // // 手动挂上构造器，指向自己的构造函数
    // Child3.prototype.constructor = Child3;
    // var s3 = new Child3();
    // var s4 = new Child3();
    // s3.play.push(4);
    // console.log(s3.play, s4.play);  // 不互相影响
    // console.log(s3.getName()); // 正常输出'parent3'
    // console.log(s4.getName()); // 正常输出'parent3'

    // 4.原型式继承
    // 主要借助Object.create方法实现普通对象的继承
    // 这种继承方式的缺点也很明显，因为Object.create方法实现的是浅拷贝，多个实例的引用类型属性指向相同的内存，存在篡改的可能

    // 5.寄生式继承

    // 6.寄生组合式继承
    //最优解
  </script>
</body>
</html>